前言
随着维护服务器量的增多,越来越觉得监控的重要性。监控,就是运维人员的眼睛,没有了监控,你不知道磁盘是否满了,网络流量是否超标,甚至服务器是否宕机。监控的重要性不言而喻。市面上的监控软件也很多,如商业版的ipmontor、opmanager,免费开源的nagios、cacti等。每个监控软件都有各自优缺点和应用场景,这里不去探讨。本文要探讨的是从一个初学者的角度去打造属于自己的监控系统。共分为三部分:email篇、web篇和移动篇(android)。好了,不废话了,下面开始。
email篇
关键字:shell、email
原理
定时执行监控脚本,提取服务器运行状态,如系统负载、磁盘空间或是相关服务是否运行等,只要有一项异常,即马上发送邮件警报。下面是脚本内容(由于只是个事例,所以只设定了两个监控项目,大家根据自己的需求增减监控项目)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #!/bin/bash #Server status monitor #by caishzh 2013 #初始化变量及设置阀值 DIR="/root/tool" NOW=$(date "+%F %T") >${DIR}/messages.txt #先清空messages.txt里的内容 ADMIN="[email protected]" #邮箱地址,用于接收警报邮件 HOSTNAME="Server1" IP=$(ifconfig eth0|grep 'inet addr'|sed 's/.*addr:\(.*\) Bcast:.*/\1/') UPTIME_MAX=3 #系统负载 DISK_MAX=90 #磁盘使用率 #系统负载 UPTIME=$(uptime|sed 's/^.*age: \(.*\)$/\1/') UPTIME_NOW=$(echo $UPTIME|awk -F',' '{print $1}') if echo "$UPTIME_NOW>$UPTIME_MAX"|bc >/dev/null;then #UPTIME_NOW包含小数,而test只支持整数间的比较,所以这里使用bc echo "UPTIME: $UPTIME" >>${DIR}/messages.txt fi #根分区 DISK=$(df -h|grep /$|awk '{print $5,$2,$4}') DISK_USAGE=$(echo $DISK|awk '{print $1}'|tr -d '%') [ "$DISK_USAGE" -ge "$DISK_MAX" ] && $(echo "DISK: $DISK" >> ${DIR}/messages.txt) #如果messages.txt文件不为空则发送警报信 if [ -s ${DIR}/messages.txt ];then mail -s "system monitor: $NOW $IP $HOSTNAME" "$ADMIN" <${DIR}/messages.txt fi
|
将脚本放到/root/tool目录下,给予执行权限:
1
| chmod 755 /root/tool/system_monitor.sh
|
放入crontab中,每3分钟执行一次:
1
| echo "*/3 * * * * root /root/tool/system_monitor.sh" >>/etc/crontab
|
实际生产环境下执行该脚本后收到的警报邮件:

参考:
简单的系统监控脚本
鸟哥的linux私房菜–学习shell scripts